home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Linux / Kubuntu 8.10 / kubuntu-8.10-desktop-i386.iso / casper / filesystem.squashfs / usr / lib / python2.5 / pty.pyc (.txt) < prev    next >
Python Compiled Bytecode  |  2008-10-29  |  5KB  |  204 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.5)
  3.  
  4. '''Pseudo terminal utilities.'''
  5. from select import select
  6. import os
  7. import tty
  8. __all__ = [
  9.     'openpty',
  10.     'fork',
  11.     'spawn']
  12. STDIN_FILENO = 0
  13. STDOUT_FILENO = 1
  14. STDERR_FILENO = 2
  15. CHILD = 0
  16.  
  17. def openpty():
  18.     '''openpty() -> (master_fd, slave_fd)
  19.     Open a pty master/slave pair, using os.openpty() if possible.'''
  20.     
  21.     try:
  22.         return os.openpty()
  23.     except (AttributeError, OSError):
  24.         pass
  25.  
  26.     (master_fd, slave_name) = _open_terminal()
  27.     slave_fd = slave_open(slave_name)
  28.     return (master_fd, slave_fd)
  29.  
  30.  
  31. def master_open():
  32.     '''master_open() -> (master_fd, slave_name)
  33.     Open a pty master and return the fd, and the filename of the slave end.
  34.     Deprecated, use openpty() instead.'''
  35.     
  36.     try:
  37.         (master_fd, slave_fd) = os.openpty()
  38.     except (AttributeError, OSError):
  39.         pass
  40.  
  41.     slave_name = os.ttyname(slave_fd)
  42.     os.close(slave_fd)
  43.     return (master_fd, slave_name)
  44.     return _open_terminal()
  45.  
  46.  
  47. def _open_terminal():
  48.     '''Open pty master and return (master_fd, tty_name).
  49.     SGI and generic BSD version, for when openpty() fails.'''
  50.     
  51.     try:
  52.         import sgi as sgi
  53.     except ImportError:
  54.         pass
  55.  
  56.     
  57.     try:
  58.         (tty_name, master_fd) = sgi._getpty(os.O_RDWR, 438, 0)
  59.     except IOError:
  60.         msg = None
  61.         raise os.error, msg
  62.  
  63.     return (master_fd, tty_name)
  64.     for x in 'pqrstuvwxyzPQRST':
  65.         for y in '0123456789abcdef':
  66.             pty_name = '/dev/pty' + x + y
  67.             
  68.             try:
  69.                 fd = os.open(pty_name, os.O_RDWR)
  70.             except os.error:
  71.                 continue
  72.  
  73.             return (fd, '/dev/tty' + x + y)
  74.         
  75.     
  76.     raise os.error, 'out of pty devices'
  77.  
  78.  
  79. def slave_open(tty_name):
  80.     '''slave_open(tty_name) -> slave_fd
  81.     Open the pty slave and acquire the controlling terminal, returning
  82.     opened filedescriptor.
  83.     Deprecated, use openpty() instead.'''
  84.     result = os.open(tty_name, os.O_RDWR)
  85.     
  86.     try:
  87.         ioctl = ioctl
  88.         I_PUSH = I_PUSH
  89.         import fcntl
  90.     except ImportError:
  91.         return result
  92.  
  93.     
  94.     try:
  95.         ioctl(result, I_PUSH, 'ptem')
  96.         ioctl(result, I_PUSH, 'ldterm')
  97.     except IOError:
  98.         pass
  99.  
  100.     return result
  101.  
  102.  
  103. def fork():
  104.     '''fork() -> (pid, master_fd)
  105.     Fork and make the child a session leader with a controlling terminal.'''
  106.     
  107.     try:
  108.         (pid, fd) = os.forkpty()
  109.     except (AttributeError, OSError):
  110.         pass
  111.  
  112.     if pid == CHILD:
  113.         
  114.         try:
  115.             os.setsid()
  116.         except OSError:
  117.             pass
  118.         except:
  119.             None<EXCEPTION MATCH>OSError
  120.         
  121.  
  122.     None<EXCEPTION MATCH>OSError
  123.     return (pid, fd)
  124.     (master_fd, slave_fd) = openpty()
  125.     pid = os.fork()
  126.     if pid == CHILD:
  127.         os.setsid()
  128.         os.close(master_fd)
  129.         os.dup2(slave_fd, STDIN_FILENO)
  130.         os.dup2(slave_fd, STDOUT_FILENO)
  131.         os.dup2(slave_fd, STDERR_FILENO)
  132.         if slave_fd > STDERR_FILENO:
  133.             os.close(slave_fd)
  134.         
  135.         tmp_fd = os.open(os.ttyname(STDOUT_FILENO), os.O_RDWR)
  136.         os.close(tmp_fd)
  137.     else:
  138.         os.close(slave_fd)
  139.     return (pid, master_fd)
  140.  
  141.  
  142. def _writen(fd, data):
  143.     '''Write all the data to a descriptor.'''
  144.     while data != '':
  145.         n = os.write(fd, data)
  146.         data = data[n:]
  147.  
  148.  
  149. def _read(fd):
  150.     '''Default read function.'''
  151.     return os.read(fd, 1024)
  152.  
  153.  
  154. def _copy(master_fd, master_read = _read, stdin_read = _read):
  155.     '''Parent copy loop.
  156.     Copies
  157.             pty master -> standard output   (master_read)
  158.             standard input -> pty master    (stdin_read)'''
  159.     while None:
  160.         (rfds, wfds, xfds) = select([
  161.             master_fd,
  162.             STDIN_FILENO], [], [])
  163.         if master_fd in rfds:
  164.             data = master_read(master_fd)
  165.             os.write(STDOUT_FILENO, data)
  166.         
  167.         if STDIN_FILENO in rfds:
  168.             data = stdin_read(STDIN_FILENO)
  169.             _writen(master_fd, data)
  170.             continue
  171.         continue
  172.         return None
  173.  
  174.  
  175. def spawn(argv, master_read = _read, stdin_read = _read):
  176.     '''Create a spawned process.'''
  177.     if type(argv) == type(''):
  178.         argv = (argv,)
  179.     
  180.     (pid, master_fd) = fork()
  181.     if pid == CHILD:
  182.         os.execlp(argv[0], *argv)
  183.     
  184.     
  185.     try:
  186.         mode = tty.tcgetattr(STDIN_FILENO)
  187.         tty.setraw(STDIN_FILENO)
  188.         restore = 1
  189.     except tty.error:
  190.         restore = 0
  191.  
  192.     
  193.     try:
  194.         _copy(master_fd, master_read, stdin_read)
  195.     except (IOError, OSError):
  196.         if restore:
  197.             tty.tcsetattr(STDIN_FILENO, tty.TCSAFLUSH, mode)
  198.         
  199.     except:
  200.         restore
  201.  
  202.     os.close(master_fd)
  203.  
  204.